/**
 * Este objeto permite la interacción con los
 * servicios web de PHP.
 */
var Services =
{
	/**
	 * Ejecuta la petición especificada, y espera hasta que
	 * retorne la respuesta del servidor para notificar este
	 * evento. Permite definir un controlador de errores que
	 * será llamado en caso de que el servicio invocado haya
	 * respondido con un código de error.
	 *
	 * @param request  Objeto request que se ejecutará.
	 * @param callback Función que será notificada cuando retorne.
	 * @param onerror  Función que será notificada en caso de errores.
	 */
	invoke : function(request, callback, onerror)
	{
		var params = this.compose(request, callback);

		$.ajax.post(params, "index.php", function(ret)
		{
			var resObj = Response.create(request.service, ret.responseText);

			if ( resObj.error && (resObj.error != 0 ) ) {
				var pError = window.Errors.add( resObj.error );

				if ( $.isProc(onerror) )
					onerror( pError );

				return;
			}

			request.extend(resObj);

			if ( $.isProc(request.callback) )
				request.callback(resObj);
		});

		return(true);
	},
	/**
	 * Ejecuta el servicio especificado.
	 *
	 * @param service  Nombre del servicio.
	 * @param callback Función de notificación de retorno.
	 * @param params   Lista de pares Parametro/Valor para enviar al servicio.
	 */
	call : function(service, callback, params){
		if ( !$.isArray(params) )
			params = arguments.toArray().slice(2);

		params.splice(0,0, service);

		var pRequest = Request.create(service, params);

		return( this.invoke(pRequest, callback) );
	},
	compose : function(request, callback){
		if ( $.isProc(callback) )
			request.callback = callback;

		var sRequest = "enc=base64&" + // Encoding
		               "rq=" + Request.serialize(request, true);

		return( sRequest );
	},
	queue : []
};

/**
 * @TODO Cola de peticiones.
 */
Services.queue.extend({
	add : function(service, params) {
		service = service.replace(/|/ig, "");
		params = arguments.toArray().slice(1);

		var pRequest = Services.createRequest(service, null, params);

		this.push(pRequest);
	},
	process : function(callback){
		if ( $.isDef(callback) )
			this.callback = callback;

		var message = "";
		var item = "";

		this.each(function(request){
			message += JSON().convert(request) + "||";
		});

		var pRequest = new Request();

		pRequest.service = "Queue";
		pRequest.callback = this.callback;
		pRequest.params.add("msg", message);

		Services.invoke(pRequest);

		this.clear();
	},
	callback : null,
	response : ""
});
window.Services = Services;
